'use strict'

// 【“不存在的属性”的问题】
// let user = {}
// console.log(user.address.street) // 报错

// *********************************************************************************

// 【可选链 ?.】
// 可选链 ?. 检查左边部分是否为 null/undefined 如果是则停止运算符并返回 undefined（“短路效应”）。如果不是则继续运算。
let user = {}
console.log(user?.address?.street) // undefined

// 注意事项：
// 1. 不要过度使用可选链，我们应该只将 ?. 使用在一些东西可以不存在的地方。
// 2. ?. 前面的变量必须已声明。

// *********************************************************************************

// 【其他变体 ?.(), ?.[]】

// ?.() 用于调用一个可能不存在的函数。如果不存在也不会报错。
let userAdmin = {
	admin() {
		console.log('I am admin')
	},
}

let userGuest = {}

userAdmin.admin?.() // I am admin
userGuest.admin?.() // 不会报错，结果为 undefined

// ?.[] 从一个可能不存在的对象上安全地读取属性。
let key = 'firstName'

let user1 = {
	firstName: 'John',
}

let user2 = null

console.log(user1?.[key]) // John
// console.log(user2[key]) // 报错
console.log(user2?.[key]) // undefined

// *********************************************************************************

// 使用 ?. 来安全地读取或删除，但不能写入
let obj = null

delete obj.name // 报错
delete obj?.name // 不报错，结果为 undefined
delete obj?.['name'] // 不报错，结果为 undefined
